package pl.edu.agh.ki.ewywiadowka.client;

import java.util.LinkedList;

import pl.edu.agh.ki.ewywiadowka.client.dto.AbsenceDTO;
import pl.edu.agh.ki.ewywiadowka.client.dto.AttendantDTO;
import pl.edu.agh.ki.ewywiadowka.client.dto.ClassDTO;
import pl.edu.agh.ki.ewywiadowka.client.dto.MarkDTO;
import pl.edu.agh.ki.ewywiadowka.client.dto.StudentDTO;
import pl.edu.agh.ki.ewywiadowka.client.dto.SubjectDTO;
import pl.edu.agh.ki.ewywiadowka.client.dto.SystemUserDTO;
import pl.edu.agh.ki.ewywiadowka.client.dto.TeacherDTO;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

/**
 * The client side stub for the RPC service.
 */
@RemoteServiceRelativePath("greet")
public interface EWywiadowkaService extends RemoteService {

	/**
	 * Rejestracja klasy
	 * 
	 * @param clas
	 *            klasa, ktora ma byc zarejestrowana w systemie
	 * @return kod bledu
	 */
	public Const.Error.ClassRegisterMsg registerClass(ClassDTO clas);

	/**
	 * Usuniecie klasy
	 * 
	 * @param clas
	 *            klasa, ktora ma byc usunieta
	 * @return kod bledu
	 */
	public Const.Error.ClassRemoveMsg removeClass(ClassDTO clas);

	/**
	 * Modyfikacja klasy, jej rocznika, litery, lub wychowawcy
	 * 
	 * @param clas
	 * @return kod bledu
	 */
	public Const.Error.ClassModifyMsg modifyClass(ClassDTO clas);

	/**
	 * Rejestracja ucznia
	 * 
	 * @param student
	 *            Uczen, ktory ma byc dodany do systemu, w srodku ma liste ISTNIEJACYCH w systemie opiekunow
	 * @return Kod bledu
	 */
	public Const.Error.StudentRegisterMsg registerStudent(StudentDTO student);

	/**
	 * Usuwa ucznia
	 * 
	 * @param student
	 *            uczen, ktory ma byc usuniety
	 * @return Kod bledu
	 */
	public Const.Error.StudentRemoveMsg removeStudent(StudentDTO student);

	/**
	 * Modyfikuje dane ucznia
	 * 
	 * @param student
	 * @return
	 */
	public Const.Error.StudentModifyMsg modifyStudent(StudentDTO student);

	/**
	 * Dodaje opiekuna
	 * 
	 * @param attendant
	 *            opiekun
	 * @return kod bledu
	 */
	public Const.Error.AttendantRegisterMsg registerAttendant(
			AttendantDTO attendant);

	/**
	 * Usuwa opiekuna
	 * 
	 * @param attendant
	 *            opiekun
	 * @return kod bledu
	 */
	public Const.Error.AttendantRemoveMsg removeAttendant(AttendantDTO attendant);

	/**
	 * Modyfikuje opiekuna
	 * 
	 * @param attendant
	 *            opiekun
	 * @return kod bledu
	 */
	public Const.Error.AttendantModifyMsg modifyAttendant(AttendantDTO attendant);

	/**
	 * Dodaje nauczyciela do systemu
	 * 
	 * @param teacher
	 * @return
	 */
	public Const.Error.TeacherRegisterMsg registerTeacher(TeacherDTO teacher);

	/**
	 * Modyfikuje dane nauczyciela
	 * 
	 * @param teacher
	 * @return
	 */
	public Const.Error.TeacherModifyMsg modifyTeacher(TeacherDTO teacher);

	/**
	 * Usuwa nauczyciela z systemu
	 * 
	 * @param teacher
	 * @return
	 */
	public Const.Error.TeacherRemoveMsg removeTeacher(TeacherDTO teacher);

	/**
	 * Funkcja powinna zwrocic liste wszystkich opiekunow
	 * 
	 * @return lista opiekunow
	 */
	public LinkedList<AttendantDTO> getAttendants();

	/**
	 * Funkcja sluzaca do logowania
	 * 
	 * @param login
	 *            string z loginem
	 * @param pass
	 *            string z haslem
	 * @return Obiekt SystemUserDTO, może byc: 
	 * 			- TeacherDTO - kiedy zaloguje sie wychowawca 
	 * 			- AttendantDTO - kiedy zaloguje sie opiekun 
	 * 			- SystemUserDTO - kiedy sekretarka lub nieznany uzytkownik 
	 * 			Wazne, zeby wypelnic pole UserDTO user loginem i atrybutami - na ich
	 *         	podstawie rzutuje po stronie klienta na odpowiedni typ
	 */
	public SystemUserDTO getSystemUser(String login, String pass);

	/**
	 * Funkcja zwraca sklad klasy
	 * 
	 * @param clas
	 * @return lista uczniow
	 */
	public LinkedList<StudentDTO> getClassSquad(ClassDTO clas);

	/**
	 * Funkcja powinna zwracac liste wszystkich nauczanych w szkole przedmiotow
	 * 
	 * @return lista przedmiotow
	 */
	public LinkedList<SubjectDTO> getSubjects();

	/**
	 * Zwraca nauczyciela nauczajacego przedmiot subject w podanej klasie clas
	 * 
	 * @param subject
	 *            przedmiot
	 * @param clas
	 *            klasa
	 * @return nauczyciel
	 */
	public TeacherDTO getSubjectTeacherForClass(SubjectDTO subject,
			StudentDTO student);

	/**
	 * Zwraca liste ocen ucznia z danego przedmiotu
	 * 
	 * @param student
	 *            uczen
	 * @param subject
	 *            przedmiot
	 * @return lista ocen
	 */
	public LinkedList<MarkDTO> getSingleMarks(StudentDTO student,
			SubjectDTO subject);

	/**
	 * zwraca wszystkich nauczycieli, ktorzy jeszcze nie sa wychowawcami
	 * 
	 * @return lista nauczycieli nie bedacych wychowawcami
	 */
	public LinkedList<TeacherDTO> getPotentialEducators();

	/**
	 * @return lista wszystkich klas zarejestrowanych w systemie
	 */
	public LinkedList<ClassDTO> getClasses();

	/**
	 * Usuwa ocene jednostkowa
	 * 
	 * @param mark
	 *            ocena, w niej jest id, wystarczy w bazie poszukac po tym id
	 * @return czy sie udalo
	 */
	public Boolean removeSingleMark(MarkDTO mark);

	/**
	 * Dodaje ocene jednostkowa
	 * 
	 * @param mark
	 *            ocena
	 * @return czy sie udalo
	 */
	public Boolean addSingleMark(MarkDTO mark, TeacherDTO teacher);

	/**
	 * Zwraca ocene koncowa ucznia z danego przedmiotu
	 * 
	 * @param student
	 *            uczen
	 * @param subject
	 *            przedmiot
	 * @return ocena koncowa, jesli nie ma - null
	 */
	public MarkDTO getFinalMark(StudentDTO student, SubjectDTO subject);

	/**
	 * Usuwa ocene koncowa
	 * 
	 * @param mark
	 *            ocena
	 * @return czy sie udalo
	 */
	public Boolean removeFinalMark(MarkDTO mark);

	/**
	 * Ustala ocene koncowa, w srodku jest dla kogo i z czego
	 * 
	 * @param mark
	 *            ocena
	 * @return czy sie udalo
	 */
	public Boolean setFinalMark(MarkDTO mark, TeacherDTO teacher);
	
	/**
	 * Zwraca liste nieobecnosci ucznia
	 * 
	 * @param student uczen
	 * @return lista nieobecnosci
	 */
	public LinkedList<AbsenceDTO> getAbsences(StudentDTO student);
	
	/**
	 * Usuwa nieobecnosc
	 * 
	 * @param absence nieobecnosc
	 * @return czy sie udalo
 	 */
	public Boolean removeAbsence(AbsenceDTO absence);
	
	/**
	 * Dodaje nieobecnosc
	 * 
	 * @param absence nieobecnosc
	 * @return kod bledu
	 */
	public Const.Error.AbsenceRegisterMsg addAbsence(AbsenceDTO absence);
	
	/**
	 * Usprawiedliwia/cofa usprawiedliwienie dla nieobecnosci
	 * 
	 * @param absence nieobecnosc
	 * @return czy sie udalo
	 */
	public Boolean excuseAbsence(AbsenceDTO absence);
	
	

	/**
	 * @return Lista wszystkich uczniow zarejestrowanyc w systemie
	 */
	public LinkedList<StudentDTO> getStudents();

	public ClassDTO getEducatorsClass(TeacherDTO educator);

	/**
	 * @return lista wszystkich nauczycieli w systemie
	 */
	public LinkedList<TeacherDTO> getTeachers();

}
